#ifndef _PUBLIC_H

#include <stdbool.h>
#define MAXSIZE 50

typedef struct item{
    int num;
    bool Is_num;        // 用来标记该节点存放的是操作符还是操作数,操作数：true,操作符：false
    char symblo;
}Item;

typedef char ElementType;

typedef struct d_node{
    Item data;      // 节点信息
    struct d_node *prev;
    struct d_node *next;
}D_Node;

typedef struct node{
    struct node *next;
    ElementType ch;
    int num;
}Node;

typedef struct stack{
    Node *top;
    int size;       // 栈计数器
}Stack;

typedef struct queue{
    D_Node *head;
    D_Node *tail;
    int size;           // 队列计数器
}Queue;


// 顺序栈
typedef struct a_stack{
    char data[MAXSIZE];
    int top;
}A_Stack;



int To_suffix_expression(char *str, int len);

// 初始化队列
void init_queue(Queue *pqueue);

// 初始化栈
void init_stack(Stack *pstack);

// 判断栈是否为空
bool is_empty_stack(Stack *pstack);

// 将一个元素压栈,返回值：1)成功    0)失败
int push(Stack *pstack, ElementType e);

//将一个元素出栈并返回
ElementType pop(Stack *pstack);     // 若返回一个？则代表栈已空

// 将一个数字压栈
int push_num(Stack *pstack, int e);

// 将一个数字出栈
int pop_num(Stack *pstack);

// 将一个操作符加入一个队列中, 返回值：1)成功     0)失败
int add(Queue *pqueue, ElementType e);

// 将一个操作数加入队列中
int add_numbers(Queue *pqueue, int e);

// 将一个元素出队列，并释放该节点，该节点元素不做返回。
void get_element(Queue *pqueue);


// 显示队列中的节点信息
void dispay(Queue *pqueue);

// 删除字符串中的所有空格符
void delete_space(char *str, int len);

// 判断栈顶节点的符号优先级与输入符号的优先级关系,若输入符号的优先级高于栈顶，则返回false;
bool priority(Stack *pstack, ElementType e);

// 若一个符号为+或则-，返回true,否则，返回false
bool is_low(ElementType e);

// 判断操作符栈的栈顶元素是不是（
bool Is_left_bracket(Stack *pstack);

// 打印栈内操作符
void dispaly_stack(Stack *pstack);

// 检查是否有非法输入：除数不能为0
bool is_legal_input(char *string);

// 顺序栈操作

void A_init_stack(A_Stack *pstack);
bool A_is_empty_stack(A_Stack *pstack);
int A_push(A_Stack *pstack, ElementType e);
ElementType A_pop(A_Stack *pstack);
void A_dispaly_s(A_Stack *pstack);
void A_Clear(A_Stack *pstack);
void A_pop_all(A_Stack *pstack,Queue *pqueue);      // 判断优先级
void fun(A_Stack *pstack,Queue *pqueue,char ch);
bool A_priority(A_Stack *pstack, ElementType e);

#endif